package pro.shushi.pamirs.demo.core.manager;

import org.apache.commons.collections4.CollectionUtils;
import pro.shushi.pamirs.core.common.ParamUtils;
import pro.shushi.pamirs.demo.api.tmodel.DemoFlowCustom;
import pro.shushi.pamirs.meta.annotation.Fun;
import pro.shushi.pamirs.meta.annotation.Function;
import pro.shushi.pamirs.meta.enmu.FunctionCategoryEnum;
import pro.shushi.pamirs.meta.enmu.FunctionOpenEnum;
import pro.shushi.pamirs.meta.enmu.FunctionTypeEnum;
import pro.shushi.pamirs.meta.util.JsonUtils;
import pro.shushi.pamirs.workflow.app.api.definition.node.ApprovalNode;
import pro.shushi.pamirs.workflow.app.api.definition.node.NodeModel;
import pro.shushi.pamirs.workflow.app.api.definition.node.NodePerson;
import pro.shushi.pamirs.workflow.app.api.entity.WorkflowContext;
import pro.shushi.pamirs.workflow.app.api.enumeration.WorkflowUserTaskOperateTypeEnum;
import pro.shushi.pamirs.workflow.app.api.model.WorkflowUserInstance;
import pro.shushi.pamirs.workflow.app.api.model.WorkflowUserTask;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * @author Nation
 * @cdate 2023-08-24 18:01
 */
@Fun(DemoFlowCustom.MODEL_MODEL)
public class WorkflowCustomFun {

    /**
     * 自定义转交人函数-参考样例 在流程设计器中设置转交人时选择函数
     * @param nodePersonList 选择的转交人
     * @param nodeModel 审批的数据源对象
     * @param context 流程运行的上下文，nodeModel的id可以在context.get(nodeModelId)方式获得审批数据
     * @return 新的转交人列表
     */
    @Function(name = "transformOrgSelect", openLevel = FunctionOpenEnum.API)
    @Function.Advanced(type= FunctionTypeEnum.QUERY,displayName = "事件转交人选择", category = FunctionCategoryEnum.CUSTOM_DESIGNER)
    public List<NodePerson> transformOrgSelect(List<NodePerson> nodePersonList, NodeModel nodeModel, WorkflowContext context) {
        String nodeModelId = nodeModel.getId();
        Object nodeData = context.get(nodeModelId);
        // TODO: 2023/11/21 增加转交人处理逻辑 
        List<NodePerson> finalNodePersonList = CollectionUtils.isEmpty(nodePersonList) ? new ArrayList<>() : nodePersonList;

        
        return finalNodePersonList;
    }


    /**
     * 转交操作后置函数,再流程设计器中审批和填写节点中 扩展设置-填写操作提交后执行函数选择
     * @param userTask 用户待办记录
     * @return 待办记录
     */
    @Function(name = "transformOrgSelectEndFun",openLevel = FunctionOpenEnum.API)
    @Function.Advanced(type= FunctionTypeEnum.QUERY,displayName = "转交操作后置函数",category = FunctionCategoryEnum.CUSTOM_DESIGNER )
    public WorkflowUserTask transformOrgSelectEndFun(WorkflowUserTask userTask) {
        //可针对操作类型进行过滤
        if (!WorkflowUserTaskOperateTypeEnum.APPROVE_TRANGER.equals(userTask.getOperateType())) {
            return userTask;
        }
        // TODO: 2023/11/21 可自定义补充业务逻辑 userTask对应中数据为本次提交T的数据


        return userTask;
    }

    /**
     * 审批后数据处理
     * @param approvalNode 审批节点
     * @param context 上下文
     * @param dataJson 审批提交数据
     * @param result 审批结果
     */
    @Function(name = "approvalDataProcessFun",openLevel = FunctionOpenEnum.API)
    @Function.Advanced(type= FunctionTypeEnum.QUERY,displayName = "审批后数据处理",category = FunctionCategoryEnum.CUSTOM_DESIGNER )
    public void approvalDataProcessFun(ApprovalNode approvalNode, WorkflowContext context, String dataJson, Boolean result) {
        //审批数据提交数据内容
        Map<String, Object> data = JsonUtils.parseMap(dataJson);
        Long id = ParamUtils.createLong(data.get("id"));
        //可根据审批结果来处理自定义数据--通过
        if(result != null && result){
            // TODO: 2024/2/23 可以根据结果自己处理业务逻辑
        }


        //拒绝
        if(result != null && !result){
            // TODO: 2024/2/23 可以根据结果自己处理业务逻辑
        }

    }
}
